package com.hzw.saas.common.storage.rsync;

import com.hzw.saas.common.storage.enums.ChecksumModeEnum;
import com.hzw.saas.common.storage.util.ChecksumUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 文件同步中，旧文件分块校验数据
 *
 * @author zzl
 * @since 06/22/2021
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class OriginBlock extends BaseBlock {

    private static final long serialVersionUID = 1L;

    /**
     * 弱校验和
     * 滚动校验和, Adler-32
     */
    protected Long weakChecksum;

    /**
     * 强校验和
     * 32位MD5摘要 16进制字符串
     */
    protected String strongChecksum;

    /**
     * constructor
     *
     * @param pos    分块在文件中的起始位置, 从0开始
     * @param length 分块长度, byte
     */
    public OriginBlock(long pos, int length) {
        super(pos, length);
    }

    /**
     * 计算弱校验和
     *
     * @param buff   分块数据缓存
     * @param offset 分块在缓存中的偏移
     */
    private void calcWeakChecksum(byte[] buff, int offset) {
        this.weakChecksum = ChecksumUtil.adler32(buff, offset, super.blockLength);
    }

    /**
     * 计算强校验和
     *
     * @param buff   分块数据缓存
     * @param offset 分块在缓存中的偏移
     */
    private void calcStrongChecksum(byte[] buff, int offset) {
        this.strongChecksum = ChecksumUtil.md5Hex(buff, offset, super.blockLength);
    }

    /**
     * 计算校验和
     *
     * @param buff         分块数据缓存
     * @param offset       分块在缓存中的偏移
     * @param checksumMode 校验和模式
     */
    public void calcChecksum(byte[] buff, int offset, Integer checksumMode) {
        ChecksumModeEnum checksumModeEnum = ChecksumModeEnum.instance(checksumMode, ChecksumModeEnum.WEAK_CHECKSUM);
        switch (checksumModeEnum) {
            case WEAK_CHECKSUM:
                this.calcWeakChecksum(buff, offset);
                break;
            case STRONG_CHECKSUM:
                this.calcStrongChecksum(buff, offset);
                break;
            case ALL_CHECKSUM:
                this.calcWeakChecksum(buff, offset);
                this.calcStrongChecksum(buff, offset);
                break;
        }
    }
}
